#ifndef MY_GETS_AND_MY_PUTS_H
#define MY_GETS_AND_MY_PUTS_H

#include "md5.h"
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <mysql/mysql.h>

#define  BIG_FILE 1024*1024*100  //100MB
                                 //枚举发送数据的类型
typedef enum {
    COMMAND_LS,//ls命令
    LS_FAILED, //LS命令错误
    COMMAND_PWD,//PWD命令
    PWD_FAILED, //PWD命令错误
    COMMAND_CD,//CD命令
    CD_FAILED, //CD命令错误
    COMMAND_MKDIR,//MKDIR命令
    MKDIR_FAILED, //MKDIR命令错误
    COMMAND_RMDIR,//RMDIR命令
    RMDIR_FAILED, //RMDIR命令错误
    COMMAND_REMOVE,//REMOVE命令
    REMOVE_FAILED, //REMOVE命令错误
    CLIENT_COMMAND,//客户端STDIN发出的命令
    COMMAND_GETS,//gets命令
    GETS_FAILED, //GETS命令错误
    COMMAND_PUTS,//puts命令
    PUTS_FAILED, //puts命令错误
    PUTS_SECOND,//puts秒传
    INVALID_COMMAND, //无效命令
    SAME_NAME_FILE,  //重名处理
    NOT_SAME_NAME,   //非重名处理
}DataType_t;
//数据发送协议小火车(TLV)
typedef struct Train_s {
    DataType_t data_type; //数据类型
    int data_len;         //data数据长度
    char data[1000];         //数据
}Train_t; 

//一次性读取len个字符，返回值为len,返回值为-1时代表服务端已经断开                                                                           
int recvn(int netfd,void * buf, int len);
//小火车装车，返回值检错
int padding_train_by_buf(Train_t * train, void * buf, DataType_t type, int len);
//接收小火车，返回值为-1时代表服务端已经断开
int recv_train(int fd, Train_t * train);
//发送小火车,返回值为send的返回值，用于判断客户端是否断开
int send_train(int netfd, Train_t * train);
//大文件接收，返回值为-1时代表服务端已经断开
int recv_and_gets_big_file(int dest_fd, int src_fd, off_t len, off_t offset);
//小文件接收，返回值为-1时代表服务端已经断开
int recv_and_gets_little_file(int dest_fd, int src_fd, off_t len);
//大文件发送
int send_big_file(int netfd,int src_fd, off_t len, off_t offset);
//小文件发送
int send_little_file(int netfd,int src_fd, off_t len);
//ls
int my_ls(Train_t train);
//cd
int my_cd(Train_t train);
//mkdir
int my_mkdir(Train_t train);
//rmdir
int my_rmdir(Train_t train);
//remove
int my_remove(Train_t train);
//pwd
int my_pwd(Train_t train);
//gets下载客户端
int my_gets(int netfd, Train_t * train);
//puts上传客户端
int my_puts(int netfd, Train_t * train);


#endif


